﻿using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/// <summary>
/// 用于最终呈现的排课完毕的课表数据。
/// 方便模拟器和图片输出接口使用的课表数据，是用户输入课表的最终“编译”后的形式。
/// </summary>
namespace HFUTCourseSimulation.Kernel.Data.Presentation {

    /// <summary>
    /// 节次的类型
    /// </summary>
    public enum IndexKind {
        /// <summary>
        /// 破晓（太阳没升起前）
        /// </summary>
        Dawn,
        /// <summary>
        /// 上午（太阳升起后到正午）
        /// </summary>
        Morning,
        /// <summary>
        /// 下午（正午到太阳落山）
        /// </summary>
        Afternoon,
        /// <summary>
        /// 晚上（太阳落山后）
        /// </summary>
        Night
    }

    public class Semester {
        /// <summary>
        /// 教学周个数。
        /// 该类保证该数值与weeks中存储的数据个数相同。
        /// </summary>
        public int weekCount;
        /// <summary>
        /// 每天课程的节次数。
        /// 该类保证该数值总是大于等于1。
        /// </summary>
        public int indexCount;
        /// <summary>
        /// 早餐插入在第几节次后。
        /// 该类保证该数值总是位于0至indexCount之间（含首尾）。
        /// </summary>
        public int breakfastAt;
        /// <summary>
        /// 午餐插入在第几节次后。
        /// 该类保证该数值总是位于0至indexCount之间（含首尾），
        /// 且总是大于等于breakfastAt。
        /// </summary>
        public int lunchAt;
        /// <summary>
        /// 晚餐插入在第几节次后。
        /// 该类保证该数值总是位于0至indexCount之间（含首尾），
        /// 且总是大于等于lunchAt。
        /// </summary>
        public int dinnerAt;
        /// <summary>
        /// 每周课程数据。
        /// </summary>
        public ImmutableList<Week> weeks;

        public IndexKind GetIndexKind(int index) {
            if (index <= 0) throw new ArgumentException("index out of range");
            else if (index <= breakfastAt) return IndexKind.Dawn;
            else if (index <= lunchAt) return IndexKind.Morning;
            else if (index <= dinnerAt) return IndexKind.Afternoon;
            else if (index <= indexCount) return IndexKind.Night;
            else throw new ArgumentException("index out of range");
        }
    }

    public class Week {
        /// <summary>
        /// 每周七天的数据。
        /// 该类保证该字段总包含7项。
        /// </summary>
        public ImmutableList<Day> days;
    }

    public class Day {
        /// <summary>
        /// 这一天的日期的字符串形式
        /// </summary>
        public string date;
        /// <summary>
        /// 这一天的所有课程。
        /// </summary>
        public ImmutableList<Lesson> lessons;
    }

    public class Lesson {
        /// <summary>
        /// 课程的名称。
        /// </summary>
        public string name;
        /// <summary>
        /// 课程的说明，例如教室位置，教师姓名等。
        /// 该值可以包含换行。
        /// </summary>
        public string description;
        /// <summary>
        /// 课程的颜色
        /// </summary>
        public Util.ColorPair color;
        /// <summary>
        /// 课程的起始节次。
        /// 该类保证该值位于1到indexCount之间（含首尾）。
        /// </summary>
        public int startIndex;
        /// <summary>
        /// 课程的节次跨度。
        /// 该类保证该值总大于0，且加上startIndex后不会大于节次数。
        /// </summary>
        public int indexSpan;
    }


}
